# 数据预处理

# 数据归一化
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
data=[[0.5,101],[0.3,86],[0.6,154],[0.2,53],[0.3,91]]
d1=pd.DataFrame(data)

scaler=MinMaxScaler()
scaler=scaler.fit(d1)
result=scaler.transform(d1)
print(result)

result2=scaler.fit_transform(d1)    # 归一化一步到位
print(result2)

d2=scaler.inverse_transform(result2)    # 返回归一化之前的数据
print(d2)

# 参数feature_range 设置归一化的范围
scaler=MinMaxScaler(feature_range=[5,10])
result3=scaler.fit_transform(d1)
print(result3)

# 数据标准化
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
scaler=scaler.fit(d1)
result4=scaler.transform(d1)
print(scaler.mean_) # 输出均值
print(scaler.var_)  # 输出方差
print(result4)
print(result4.mean())   # 标准化后均值为0
print(result4.std())    # 标准化后方差为1

result5=scaler.fit_transform(d1)    # 归一化一步到位
print(result5)

d2=scaler.inverse_transform(result5)    # 返回归一化之前的数据
print(d2)


# 填补缺失值
from sklearn.impute import SimpleImputer
# SimpleImputer(d1
              # ,missing_values=  #缺失值是什么，可以用来替换指定值
              # ,strategy=
              # 字段是数字：mean均值,median中位数
              # 字段是数字或文本：most_frequent众数,constant固定值
              # ,fill_value=  #当strategy=“constant”使用
              # ,copy=    #创建特征矩阵副本
              # )

# 处理分类性特征
from sklearn.preprocessing import LabelEncoder
y=[[1,'a'],[3,'b'],[3,'c'],[4,'a'],[5,'e']]
d_y=pd.DataFrame(y)
print(d_y)

le=LabelEncoder()
le=le.fit(d_y[1])

d_y[2]=le.transform(d_y[1])
print(d_y)
print(le.classes_)

d_y[3]=le.fit_transform(d_y[1])
print(d_y)

d_y[4]=le.inverse_transform(d_y[3])
print(d_y)

# 特征专用编码
from sklearn.preprocessing import OrdinalEncoder
print(OrdinalEncoder().fit(d_y[[0,1]]).categories_)
print(OrdinalEncoder().fit_transform(d_y[[1]]))


# 独热编码
from sklearn.preprocessing import OneHotEncoder
y=[[1,'a','one'],[3,'b','one'],[3,'c','two'],[4,'a','one'],[5,'e','two']]
d_y=pd.DataFrame(y)
print(d_y.loc[:,1:2])
oh=OneHotEncoder()
oh=oh.fit(d_y.loc[:,1:2])
result=oh.transform(d_y.loc[:,1:2]).toarray()
# print(oh.get_feature_names())   #返回onehot之后的特征名称
# print(result)
d_oh=pd.DataFrame(result,columns=oh.get_feature_names())    # onehot编码后生成DataFrame
print(d_oh)

print(OneHotEncoder().fit_transform(d_y.loc[:,1:2]).toarray())

# 连续型特征二分法
from sklearn.preprocessing import Binarizer
d_y=pd.DataFrame(y)
print(d_y[0])
print(Binarizer(threshold=3).fit_transform(d_y[0].values.reshape(-1,1)))
# threshold 界限，小于等于threshold的为0，大于的为1

# 连续型特征分箱
# from sklearn.preprocessing import KBinsDiscretizer
# KBinsDiscretizer(
#     n_bins=     #分箱数量
#     ,encode=    #编码方式，默认onehot，可改ordinal,onehot-dense
#     ,strategy=  #分箱宽的方式，默认等位分箱quantile,等宽分箱uniform,聚类分箱kmeans
# )

# 包含特征选择的各种方法的实践
# from sklearn.feature_selection
# 包含降维算法
# from sklearn.decomposition